home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / packet / praf205e / setkiss.c < prev    next >
C/C++ Source or Header  |  1993-06-05  |  12KB  |  532 lines

  1. /*
  2.     SETKISS.C
  3.  
  4.     Version 2.1  6/6/1993 - Marco Savegnago IW3FQG
  5.  
  6.     This simple program turn on and off kissmode in many TNC directly from
  7.     DOS prompt.
  8.  
  9.     Use it in a startup batch before running any program which need kiss mode
  10.     tnc/operation.
  11.  
  12.     SetKiss 2.1 - 1990/1993 Marco Savegnago IW3FQG
  13.  
  14.     Set/Reset Kiss mode utility for use with the most TNC's type
  15.  
  16.     This is am HAMWARE program, so it can be copied/modify freely but not for
  17.     commercial purposes!
  18.  
  19.     Usage SetKiss [command] <options>
  20.  
  21.     command:
  22.  
  23.     Cx    specify com number 1,2,3 or 4.
  24.  
  25.     Ffilename specify filename to send
  26.  
  27.     In the file you can put any string or number or this command:
  28.  
  29.             -B          send BREAK
  30.             -C          send CTRL-C
  31.             -R          send CR
  32.             -nn         send any ASCII char (es -9 send TAB)
  33.             @filename   send filename (recoursing limited to 20 - 3 handle)
  34.  
  35.     Phhhh specify i/o port address in hex es: P03F8
  36.  
  37.     Sx    set COM speed (3)00 (1)200 (2)400 (4)800 (9)600
  38.                               192(0)0 3(8)400 5(7)600 11(5)200 baud
  39.  
  40.     Tp    set TNC type  A = AEA PK88 PK232
  41.                         O = Kantronics KPC's or KAM with old eprom
  42.                         K = Kantronics KPC's or KAM with eprom >= 3.XX
  43.                         T = TAPR TNC's and clone with std eprom
  44.                         H = TAPR TNC's and clone with HOST eprom
  45.  
  46.     U|L  uninstall kiss using standard leave kiss sequence
  47.                                 (may not run in certain eprom)
  48.  
  49.     This program is part of IW3FQG's FOOT (FQG Own Original Tools)
  50.  
  51.     It was written for my personal use and for my personal needs!
  52.  
  53.     This is an HAMWARE software, no registration is required!
  54.  
  55.     To recompile this program use Turbo C/C++ 1.0 or later.
  56.  
  57.  
  58.     ERROR_LEVEL:
  59.  
  60.            -1   - Show usage
  61.             0   - OK, KISS (probably) set
  62.             1   - Switch/Command error
  63.             2   - TNC (probably) OFF
  64.             3   - invalid com number
  65.             4   - no filename specified
  66.             5   - port address not valid
  67.             6   - invalid TNC type
  68.             7   - invalid speed
  69.  
  70. */
  71.  
  72. #include <stdio.h>
  73. #include <stdlib.h>
  74. #include <string.h>
  75. #include <ctype.h>
  76. #include <dos.h>
  77. #include <conio.h>
  78. #include <dir.h>
  79.  
  80. #define KO 1
  81. #define OK 0
  82.  
  83. #define NO  0
  84. #define YES 1
  85.  
  86. #define OK_PORT     0x01
  87. #define OK_SPEED    0x02
  88.  
  89. #define OK_TYPE     0x10
  90. #define OK_FILE     0x20
  91.  
  92.  
  93. int com_base;
  94. char tnc_type;
  95.  
  96. char _send_filename[MAXPATH];
  97.  
  98. const char thisVersion[] = "2.1";
  99. const int std_combase[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
  100.  
  101. struct b_rate
  102. {
  103.         char speed; unsigned value;
  104. }
  105.  
  106. baud_rate[] =
  107. {
  108.         {   '3',  0x0180 } ,
  109.         {   '1',  0x0060 } ,
  110.         {   '2',  0x0030 } ,
  111.         {   '4',  0x0018 } ,
  112.         {   '9',  0x000c } ,
  113.         {   '0',  0x0006 } ,
  114.         {   '8',  0x0003 } ,
  115.         {   '7',  0x0002 } ,
  116.         {   '5',  0x0001 }
  117. };
  118.  
  119. struct kiss_c
  120. {
  121.     char type;
  122.     char *string;
  123. }
  124.  
  125. kiss_cmd[] =
  126. {
  127. { 'N', "\xC0\xFF\xC0"     } ,  /* leave kiss string */
  128. { 'A', "CONMODE TRANS\r"
  129.        "PP ON\r"
  130.        "RAW ON\r"
  131.        "HP OFF\r"
  132.        "KISS ON\r"
  133.        "HOST ON\r"        } ,  /* AEA */
  134. { 'T', "KISS ON\r"
  135.        "RESTART\r"        } ,  /* TAPR TNC2 */
  136. { 'O', "KISSMODE ON\r"
  137.        "RESET\r"          } ,  /* KANTRONICS 2.XX */
  138. { 'K', "INTFACE KISS\r"
  139.        "RESET\r"          } ,  /* KANTRONICS 3.XX */
  140.  
  141. { 'H', "\x11\x18\x1b@K\r" }    /* TF 2.1c (by Nord<>Link) for TNC2 */
  142.  
  143. };
  144.  
  145. int     _htoi           (char *);
  146. void    close_com       (void);
  147. int     open_com        (unsigned);
  148. int     send_kiss       (char);
  149. int     send_com        (char *);
  150. void    usage           (void);
  151. void    cmd_error_exit  (int);
  152. void    parse_cmd       (char *);
  153. void    send_file       (char *);
  154. void    send_break      (void);
  155.  
  156. /*
  157. ** The main thing
  158. */
  159.  
  160. int main(int na,char **a)
  161. {
  162.         char *p;
  163.         int narg,i,len;
  164.         unsigned speed;
  165.         char cmdline = 0;
  166.         char cmderror = NO;
  167.  
  168.         printf("\nSetKiss %s - 1990/1993 Marco Savegnago IW3FQG  %s\n\n", thisVersion, __DATE__);
  169.  
  170. /*
  171. **  See if command line is complete with argoment
  172. */
  173.  
  174.         for ( narg = 1; narg < na; narg++ )
  175.         {
  176.             p=a[narg];
  177.             if ( *p == '-' || *p == '/')
  178.             {
  179.                 p++;
  180.                 switch(toupper(*p))
  181.                 {
  182.                     case '?':
  183.                     case 'H':
  184.                         usage();
  185.                         return(-1);
  186.  
  187.                     case 'C': // com
  188.                         if (!*++p || *(p+1) || !strpbrk ( p, "1234"))
  189.                                                             cmd_error_exit(1);
  190.  
  191.                         com_base = std_combase[ *p - '1'];
  192.                         cmdline |= OK_PORT;
  193.                         break;
  194.  
  195.                     case 'F': // custom kiss send by file
  196.                         if (!*(p+1))
  197.                             cmd_error_exit(2);
  198.  
  199.                         strcpy(_send_filename,p);
  200.                         cmdline |= OK_FILE;
  201.                         break;
  202.  
  203.                     case 'P': // port
  204.                         if (!*++p || (len=strlen(p),len < 3 || len > 4))
  205.                                                             cmd_error_exit(3);
  206.  
  207.                         com_base = _htoi(p);
  208.                         cmdline |= OK_PORT;
  209.                         break;
  210.  
  211.                     case 'S': // speed
  212.                         if (!*++p || *(p+1) || ! strpbrk (p, "312490875"))
  213.                                                             cmd_error_exit(4);
  214.  
  215.                         cmdline |= OK_SPEED;
  216.  
  217.                         for (i = 0; *p != baud_rate[i].speed; i++)
  218.                         ;
  219.                         speed=baud_rate[i].value;
  220.                         break;
  221.  
  222.                     case 'T': // type
  223.                         if (!*++p || *(p+1))
  224.                                 cmd_error_exit(3);
  225.  
  226.                         tnc_type=*p=toupper(*p);
  227.                         if (!strpbrk (p, "ATKOH"))
  228.                                     cmd_error_exit(5);
  229.  
  230.                         cmdline |= OK_TYPE;
  231.                         break;
  232.  
  233.                     case 'L':
  234.                     case 'U': // unistall kiss
  235.                         tnc_type = 'N';
  236.                         cmdline |= OK_TYPE;
  237.                         break;
  238.  
  239.                     default: // unknow switch
  240.                         cmderror = YES;
  241.                         printf("\aError! Invalid switch <%s>. Type /? for Help.\n",--p);
  242.                         break;
  243.                 }
  244.             }
  245.             else
  246.             {
  247.                 cmderror = YES;
  248.                 printf("\aError! Invalid command <%s>. Type /? for Help.\n",p);
  249.             }
  250.         }
  251.  
  252.         if (cmderror)
  253.                 return(1);
  254.  
  255.         if (! (cmdline & OK_PORT) || ! (cmdline & OK_SPEED) ||
  256.                         ! (cmdline & OK_TYPE || cmdline & OK_FILE))
  257.         {
  258.                 puts("\aError! Not enough operand! Type /? for help.\n");
  259.                 return(1);
  260.         }
  261.  
  262.         if (KO == open_com(speed))
  263.         {
  264.                 close_com();
  265.                 return(2);
  266.         }
  267.  
  268.  
  269.         if (cmdline & OK_TYPE)
  270.                 send_kiss(tnc_type);
  271.  
  272.         if (cmdline & OK_FILE)
  273.                 send_file(_send_filename);
  274.  
  275.         close_com();
  276.  
  277.         return(OK);
  278. }
  279.  
  280.  
  281. /*
  282. **  HexString to int without use assembly ...
  283. */
  284.  
  285. int _htoi (char *p)
  286. {
  287.         register int i;
  288.         int ret=0,mult=1;
  289.         char ch;
  290.  
  291.         i=strlen(p);
  292.  
  293.         while(i--)
  294.         {
  295.             ch = toupper(*(p+i));
  296.  
  297.             if(isalpha(ch))
  298.                     ch -= ('A' - 10);
  299.             else
  300.                     ch -= '0';
  301.  
  302.             ret += ch * mult;
  303.             mult *= 16;
  304.         }
  305.  
  306.         return (ret);
  307. }
  308.  
  309.  
  310. /*
  311. **  Close COM (reset DTR e RTS)
  312. */
  313.  
  314. void close_com (void)
  315. {
  316.           outportb (com_base + 4,0);
  317. }
  318.  
  319.  
  320. /*
  321. ** Open COM
  322. */
  323.  
  324. int open_com (unsigned speed)
  325. {
  326. /*
  327. **    Check if TNC is on
  328. */
  329.  
  330.       if (!(inport(com_base + 6) & 0x10))
  331.       {
  332.             puts("\aTNC (probably) OFF!");
  333.             return(KO);
  334.       }
  335.  
  336. /*
  337. **    Set DLAB in the Line Control Register to set the speed
  338. */
  339.  
  340.       outportb ( com_base + 3 , 0x80 );
  341.  
  342. /*
  343. **    Set serial speed
  344. */
  345.  
  346.       outport ( com_base, speed );
  347.  
  348. /*
  349. **    Reset DLAB in the LCR and then set 8N1 as serial param
  350. */
  351.       outportb ( com_base + 3 ,0x03 );
  352.  
  353. /*
  354. **    Set RTS e DTR
  355. */
  356.  
  357.       outportb ( com_base + 4 ,0x03 );
  358.  
  359.       return (OK);
  360. }
  361.  
  362.  
  363. /*
  364. **  Select and then send Kiss string
  365. */
  366.  
  367. int send_kiss(char tnc_type)
  368. {
  369.     register int i;
  370.  
  371.     for (i = 0;tnc_type!=kiss_cmd[i].type;i++)
  372.     ;
  373.  
  374.     send_com(kiss_cmd[i].string);
  375.  
  376.     printf("Kissmode (probably) %sset!\n",(tnc_type!='N') ? "" : "un");
  377.  
  378.     return(OK);
  379. }
  380.  
  381.  
  382. /*
  383. **  Send kiss string to comport
  384. */
  385.  
  386. int send_com(char *s)
  387. {
  388.     while(*s)
  389.     {
  390.         outportb(com_base,*s++);
  391.         while (!(inportb (com_base + 5) & 0x20))
  392.                                 if(kbhit()) return(1); // Avoid dead loop
  393.         delay(10);
  394.     }
  395.  
  396.     return(0);
  397. }
  398.  
  399.  
  400. /*
  401. **  Print usage
  402. */
  403.  
  404. void usage (void)
  405. {
  406.  
  407. char usage_str[] =
  408.      "Set/Reset Kiss mode utility for use with the most TNC's type\n\n"
  409.  
  410.      "This is am HAMWARE program, so it can be copied/modify freely but not for\n"
  411.      "commercial purposes!\n\n"
  412.  
  413.      "Usage SetKiss [/|-command]\n\n"
  414.  
  415.      "command:\n"
  416.      "Cx        specify com number 1,2,3 or 4.\n"
  417.      "Ffilename specify filename to send.\n"
  418.      "Phhhh     specify i/o port address in hex es: P03F8\n"
  419.      "Sx        set COM speed (3)00 (1)200 (2)400 (4)800 (9)600\n"
  420.      "\t\t\t\t192(0)0 3(8)400 5(7)600 11(5)200 baud\n\n"
  421.  
  422.      "Tp        set TNC type  A = AEA PK88 PK232\n"
  423.      "\t\t\tO = Kantronics KPC's or KAM with old eprom\n"
  424.      "\t\t\tK = Kantronics KPC's or KAM with eprom >= 3.XX\n"
  425.      "\t\t\tT = TAPR TNC's and clone with std eprom\n"
  426.      "\t\t\tH = TAPR TNC's and clone with HOST eprom\n\n"
  427.      "U|L       uninstall kiss using standard leave kiss sequence"
  428.  
  429.      ;
  430.  
  431.      puts(usage_str);
  432. }
  433.  
  434.  
  435. /*
  436. **  Print command error then exit with error level
  437. */
  438.  
  439. void cmd_error_exit (int num)
  440. {
  441.     char *str[] =
  442.     {
  443.         "invalid com number",
  444.         "no filename specified",
  445.         "port address specification is not valid",
  446.         "invalid speed",
  447.         "invalid TNC type"
  448.     };
  449.  
  450.  
  451.     printf ("\nError %s \a\n",str[num-1]);
  452.     exit(num+2);
  453. }
  454.  
  455.  
  456. /*
  457. **  Parse command in file
  458. */
  459.  
  460. void parse_cmd (char *str)
  461. {
  462.     char cmd[10];
  463.  
  464.     if (*str=='-')
  465.     {
  466.         switch(toupper(*++str))
  467.         {
  468.             case 'B':
  469.                 send_break();
  470.                 break;
  471.             case 'C':
  472.                 send_com("\x03");
  473.                 break;
  474.             case 'R':
  475.                 send_com("\r");
  476.                 break;
  477.             default:
  478.                 if(isdigit(*str))
  479.                 {
  480.                      sprintf(cmd,"%c",atoi(str));
  481.                      send_com(cmd);
  482.                 }
  483.                 break;
  484.         }
  485.     }
  486.     else if (*str == '@' && strlen(str) > 1)  // Max file handle is 20
  487.                                     send_file(str);
  488.     else
  489.     {
  490.             send_com(str); send_com(" ");
  491.     }
  492. }
  493.  
  494. /*
  495. **  Send file to COM
  496. */
  497.  
  498. void send_file (char *str)
  499. {
  500.     FILE *f;
  501.     char cmd[256];
  502.  
  503.     str++;
  504.  
  505.     if((f=fopen(str,"rt"))==NULL)
  506.     {
  507.         printf("\n\aError opening file %s\n",str);
  508.         return;
  509.     }
  510.  
  511.     while(!feof(f))
  512.     {
  513.         if(EOF==fscanf(f,"%255s",cmd)) break;
  514.         parse_cmd(cmd);
  515.     }
  516.  
  517.     fclose(f);
  518. }
  519.  
  520. /*
  521. **  Send BREAK
  522. */
  523.  
  524. void send_break(void)
  525. {
  526.         int state=inportb(com_base+3);
  527.         outport(com_base+3,state|0x40);
  528.         delay(300);
  529.         outport(com_base+3,state^=0x40);
  530. }
  531.  
  532.